home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------------------------------
-
- AOCE Post Office Protocol (POP) / Simple Mail Transfer Protocol (SMTP)
- Mail Service Access Module
-
- written by Steve Falkenburg-- MacDTS
- ©1991-1993 Apple Computer, Inc.
-
- --------------
- change history
- --------------
-
- SJF 02/19/93 update for beta build b1
- SJF 10/29/92 update to a11 a11
- SJF 06/08/92 update to a8 a8
- SJF 02/15/92 first working version a4.5
- SJF 10/16/91 initial coding a3
-
- ---------------------------------------------------------------------*/
-
- #ifndef __TYPES__
- #include <Types.h>
- #endif
-
- #ifndef __OCE__
- #include <OCE.h>
- #endif
-
- #ifndef __OCEMAIL__
- #include <OCEMail.h>
- #endif
-
- #include "const.h"
- #include "gwerrors.h"
- #include "mytypes.h"
- #include "globals.h"
- #include "utils.h"
- #include "spoolsystem.h"
- #include "gatewaystuff.h"
-
- #include "spoolfromaoce.h"
-
-
- OSErr SpoolFromAOCE(MailMsgRef mailRef,FSSpec *spoolSpec)
- {
- OSErr err;
-
- // put message data into spool file
-
- err = SpoolAttributesFromAOCE(spoolSpec,mailRef);
- if (err!=noErr) {
- RemoveSpoolFile(spoolSpec);
- return err;
- }
-
- err = SpoolAddressFromAOCE(spoolSpec,mailRef);
- if (err!=noErr) {
- RemoveSpoolFile(spoolSpec);
- return err;
- }
-
- err = SpoolContentsFromAOCE(spoolSpec,mailRef);
- if (err!=noErr) {
- RemoveSpoolFile(spoolSpec);
- return err;
- }
-
- return noErr;
- }
-
-
- OSErr SpoolAttributesFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
- {
- OSErr err;
- MSAMGetAttributesPB gwp;
- MailAttributeBitmap reqBitmap;
- MaximumLetterAttributes attrib;
- long *clrBitmap;
- char *attribPtr;
-
-
- // get attributes from letter
-
- clrBitmap = (long *)&reqBitmap;
- *clrBitmap = 0L;
-
- reqBitmap.letterID = reqBitmap.replyID = reqBitmap.conversationID = reqBitmap.sendTimeStamp =
- reqBitmap.indications = reqBitmap.subject = 1;
-
- attribPtr = (char *)&attrib;
-
- gwp.ioCompletion = (ProcPtr)MSAMCompletion;
- gwp.mailMsgRef = mailRef;
- gwp.requestMask = reqBitmap;
- gwp.buffer.bufferSize = sizeof(MaximumLetterAttributes);
- gwp.buffer.buffer = attribPtr;
- gwp.more = false;
-
- MSAMGetAttributes((MSAMParam *)&gwp,true);
- err = WaitPBDone(&gwp);
- if (err!=noErr)
- return err;
-
- // spool received attributes to disk
-
- if (gwp.responseMask.letterID) {
- err = SpoolToFile(spoolSpec,kLetterIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
- if (err!=noErr)
- return err;
- attribPtr += sizeof(MailLetterID);
- }
-
- if (gwp.responseMask.replyID) {
- err = SpoolToFile(spoolSpec,kReplyIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
- if (err!=noErr)
- return err;
- attribPtr += sizeof(MailLetterID);
- }
-
- if (gwp.responseMask.conversationID) {
- err = SpoolToFile(spoolSpec,kConversationIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
- if (err!=noErr)
- return err;
- attribPtr += sizeof(MailLetterID);
- }
-
- if (gwp.responseMask.sendTimeStamp) {
- err = SpoolToFile(spoolSpec,kSendTimeType,kAttribCreator,0,attribPtr,sizeof(MailTime));
- if (err!=noErr)
- return err;
- attribPtr += sizeof(MailTime);
- }
-
- if (gwp.responseMask.indications) {
- err = SpoolToFile(spoolSpec,kIndicationsType,kAttribCreator,0,attribPtr,sizeof(MailIndications));
- if (err!=noErr)
- return err;
- attribPtr += sizeof(MailIndications);
- }
-
- if (gwp.responseMask.subject) {
- err = SpoolToFile(spoolSpec,kSubjectType,kAttribCreator,0,attribPtr,sizeof(RString));
- if (err!=noErr)
- return err;
- attribPtr += sizeof(RString);
- }
- }
-
-
- OSErr SpoolAddressFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
- {
- OSErr err;
-
- // spool resolved addresses
-
- err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailResolvedList);
- if (err!=noErr)
- return err;
-
- // spool from
-
- err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailFromBit);
- if (err!=noErr)
- return err;
-
- // spool to
-
- err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailToBit);
- if (err!=noErr)
- return err;
-
- // spool cc
-
- err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailCcBit);
- if (err!=noErr)
- return err;
-
- // spool bcc
-
- err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailBccBit);
- if (err!=noErr)
- return err;
-
- return err;
- }
-
-
- OSErr SpoolGenericAddressFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef,MailAttributeID attrID)
- {
- OSErr err;
- MSAMGetRecipientsPB gwp;
- short index,procIndex,numRecipients,internalRecipIndex;
- OSType spoolType;
- OriginalRecipientReply *origBlock;
- ResolvedRecipientReply *resolvedBlock;
- MailOriginalRecipientExt *origPtr;
- MailResolvedRecipientExt *resolvedPtr;
- Ptr ptrData,recipientPtr;
- Boolean doingResolved;
- short reportIndex = 0;
-
- ptrData = NewPtrChk(kMaxRecipSize);
- if (MemError()!=noErr)
- return MemError();
-
- doingResolved = false;
- origBlock = (OriginalRecipientReply *) ptrData;
- resolvedBlock = (ResolvedRecipientReply *) ptrData;
-
- switch (attrID) {
- case kMailResolvedList:
- doingResolved = true;
- spoolType = kResolvedRecType;
- break;
- case kMailFromBit:
- spoolType = kFromType;
- break;
- case kMailToBit:
- spoolType = kToType;
- break;
- case kMailCcBit:
- spoolType = kCCType;
- break;
- case kMailBccBit:
- spoolType = kBCCType;
- break;
- default:
- DisposPtrChk(ptrData);
- return kUnexpectedAOCECondition;
- }
-
- gwp.ioCompletion = (ProcPtr)MSAMCompletion;
- gwp.mailMsgRef = mailRef;
- gwp.attrID = attrID;
- gwp.startIndex = 1;
- gwp.buffer.buffer = ptrData;
- gwp.buffer.bufferSize = kMaxRecipSize;
- gwp.more = true; // start at true to kick-start for loop
- gwp.nextIndex = 1;
-
- err = noErr;
- for (index=1; gwp.more==true && err==noErr; index=gwp.nextIndex) {
-
- gwp.startIndex = gwp.nextIndex; // get next recipient
-
- MSAMGetRecipients((MSAMParam *)&gwp,true);
- err = WaitPBDone(&gwp);
- if (err!=noErr) {
- DisposPtrChk(ptrData);
- return err;
- }
-
- recipientPtr = ptrData + sizeof(short);
- numRecipients = origBlock->reply.tupleCount;
- for (procIndex=0; procIndex<numRecipients && err==noErr; procIndex++) {
- if (doingResolved) {
- resolvedPtr = (MailResolvedRecipientExt *)recipientPtr;
- internalRecipIndex = resolvedPtr->ext.index;
- recipientPtr += (sizeof(MailResolvedRecipient)+sizeof(short)+resolvedPtr->packedRecip.dataLength);
- if ((unsigned long)recipientPtr % 2)
- recipientPtr++;
- if (resolvedPtr->ext.responsible) {
- err = SpoolSingleRecipient(spoolSpec,spoolType,procIndex,&resolvedPtr->packedRecip);
- if (err==noErr) {
- //
- // **NOTE** this is different from previous builds!
- // you now need to use the procIndex+index for the index instead of internalRecipientIndex!
- //
- err = SpoolRecipientReport(spoolSpec,procIndex+index,reportIndex++);
- }
- }
- }
- else {
- origPtr = (MailOriginalRecipientExt *)recipientPtr;
- internalRecipIndex = origPtr->ext.index;
- recipientPtr += (sizeof(MailOriginalRecipient)+sizeof(short)+origPtr->packedRecip.dataLength);
- if ((unsigned long)recipientPtr % 2)
- recipientPtr++;
- err = SpoolSingleRecipient(spoolSpec,spoolType,procIndex,&origPtr->packedRecip);
- }
- }
- }
-
- DisposPtrChk(ptrData);
- return err;
- }
-
-
- OSErr SpoolRecipientReport(FSSpec *spoolSpec,short recipIndex,short myIndex)
- {
- OSErr err;
-
- err = SpoolToFile(spoolSpec,kRecipientType,kReportCreator,myIndex,(Ptr)&recipIndex,(unsigned long)sizeof(short));
- return err;
- }
-
-
- OSErr SpoolSingleRecipient(FSSpec *spoolSpec,OSType spoolType,short index,OCEPackedRecipient *pRecip)
- {
- OSErr err;
-
- err = SpoolToFile(spoolSpec,spoolType,kAddrCreator,index,(Ptr)pRecip,(unsigned long)pRecip->dataLength+sizeof(short));
- return err;
- }
-
-
- OSErr SpoolContentsFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
- {
- MSAMGetContentPB gwp;
- Ptr dataBuffer;
- StScrpRec *textScrap;
- OSErr err;
- Boolean startOfBlock;
- OSType spoolType;
- unsigned short blockIndex;
-
- // allocate data buffer
-
- dataBuffer = NewPtr(kMaxBufferSize);
- if (MemError()!=noErr)
- return MemError();
-
- // allocate scrap record
-
- textScrap = (StScrpRec *)NewPtr(sizeof(StScrpRec));
- if (MemError()!=noErr)
- return MemError();
-
- // fill in our parameter block
-
- gwp.ioCompletion = (ProcPtr)MSAMCompletion;
- gwp.mailMsgRef = mailRef;
- gwp.buffer.buffer = dataBuffer;
- gwp.buffer.bufferSize = kMaxBufferSize;
- gwp.segmentMask = kMailTextSegmentMask | kMailPictSegmentMask | kMailSoundSegmentMask |
- kMailMovieSegmentMask; // spool everything except styled text
- gwp.textScrap = textScrap;
-
- // read all of the letter blocks
-
- startOfBlock = true;
- blockIndex = 0;
- do {
- textScrap->scrpNStyles = sizeof(ScrpSTTable)/sizeof(ScrpSTElement);
- gwp.segmentID = 0;
- MSAMGetContent((MSAMParam *)&gwp,true);
- err = WaitPBDone(&gwp);
- if ((err==noErr) && (gwp.buffer.dataSize>0)) {
- switch (gwp.segmentType) {
- case kMailTextSegmentType:
- spoolType = kTextContent;
- break;
- case kMailPictSegmentType:
- spoolType = kPictContent;
- break;
- case kMailSoundSegmentType:
- spoolType = kSoundContent;
- break;
- case kMailStyledTextSegmentType:
- spoolType = kStyledTextContent;
- break;
- case kMailMovieSegmentType:
- spoolType = kMovieContent;
- break;
- }
- if (startOfBlock) {
- SpoolToFile(spoolSpec,spoolType,kContentCreator,blockIndex,gwp.buffer.buffer,gwp.buffer.dataSize);
- startOfBlock = false;
- }
- else
- AppendToSpool(spoolSpec,spoolType,kContentCreator,blockIndex,gwp.buffer.buffer,gwp.buffer.dataSize);
- if (gwp.endOfSegment==true) {
- startOfBlock = true;
- blockIndex++;
- }
- }
- } while ((err==noErr) && (gwp.endOfContent==false));
-
- DisposPtrChk((Ptr)textScrap);
- DisposPtrChk(dataBuffer);
-
- return err;
- }